package com.mm.cloth.api;

import com.mm.cloth.model.Category;
import com.mm.cloth.model.request.CategoryRequest;
import com.mm.cloth.model.request.CategorySortRequest;
import com.mm.cloth.model.request.LoginRequest;
import com.mm.cloth.model.request.RegisterRequest;
import com.mm.cloth.model.request.UpdateUserRequest;
import com.mm.cloth.model.response.ApiResponse;
import com.mm.cloth.model.response.ClothesListResponse;
import com.mm.cloth.model.response.LoginResponse;
import com.mm.cloth.model.response.ServerLoginResponse;
import com.mm.cloth.model.response.SystemConfigResponse;

import java.util.List;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.DELETE;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.PUT;
import retrofit2.http.Path;
import retrofit2.http.Query;

/**
 * API服务接口
 * 定义所有API调用方法，参考UniApp项目的API调用方式
 */
public interface ApiService {

    /**
     * 用户登录 - 无需token
     * @param loginRequest 登录请求体
     * @return 服务器登录响应
     */
    @POST("api/user/login")
    Call<ApiResponse<ServerLoginResponse>> login(@Body LoginRequest loginRequest);

    /**
     * 用户注册 - 无需token
     * @param registerRequest 注册请求体
     * @return 注册响应
     */
    @POST("api/user/register")
    Call<ApiResponse<LoginResponse>> register(@Body RegisterRequest registerRequest);

    /**
     * 获取衣物列表 - 需要token
     * 参考UniApp项目中的clothesApi.getClothesList方法
     * @param page 页码
     * @param pageSize 每页大小
     * @param categoryId 分类ID（可选）
     * @param season 季节（可选）
     * @param keyword 搜索关键词（可选）
     * @return 衣物列表响应
     */
    @GET("api/clothes/list")
    Call<ApiResponse<ClothesListResponse>> getClothesList(
            @Query("page") int page,
            @Query("pageSize") int pageSize,
            @Query("categoryId") Integer categoryId,
            @Query("season") String season,
            @Query("keyword") String keyword
    );

    /**
     * 获取系统配置 - 无需token（公开接口）
     * @return 系统配置响应
     */
    @GET("api/system/config")
    Call<ApiResponse<SystemConfigResponse>> getSystemConfig();

    /**
     * 获取分类列表 - 需要token
     * @return 分类列表响应
     */
    @GET("api/category/list")
    Call<ApiResponse<List<Category>>> getCategoryList();

    /**
     * 获取分类详情 - 需要token
     * @param id 分类ID
     * @return 分类详情响应
     */
    @GET("api/category/{id}")
    Call<ApiResponse<Category>> getCategoryDetail(@Path("id") Integer id);

    /**
     * 添加分类 - 需要token
     * @param request 分类请求参数
     * @return 添加响应，返回新分类的ID
     */
    @POST("api/category/add")
    Call<ApiResponse<Integer>> addCategory(@Body CategoryRequest request);

    /**
     * 更新分类 - 需要token
     * @param id 分类ID
     * @param request 分类请求参数
     * @return 更新响应
     */
    @PUT("api/category/{id}")
    Call<ApiResponse<Boolean>> updateCategory(@Path("id") Integer id, @Body CategoryRequest request);

    /**
     * 删除分类 - 需要token
     * @param id 分类ID
     * @return 删除响应
     */
    @DELETE("api/category/{id}")
    Call<ApiResponse<Boolean>> deleteCategory(@Path("id") Integer id);

    /**
     * 更新分类排序 - 需要token
     * @param request 排序请求参数
     * @return 排序响应
     */
    @POST("api/category/update-order")
    Call<ApiResponse<Boolean>> updateCategoriesOrder(@Body CategorySortRequest request);

    /**
     * 获取用户信息 - 需要token
     * @return 用户信息响应
     */
    @GET("api/user/profile")
    Call<ApiResponse<Object>> getUserProfile();

    /**
     * 更新用户信息 - 需要token
     * @param updateRequest 更新用户信息请求体
     * @return 更新响应
     */
    @POST("api/user/update")
    Call<ApiResponse<Object>> updateUserProfile(@Body UpdateUserRequest updateRequest);

    /**
     * 用户登出 - 需要token
     * @return 登出响应
     */
    @POST("api/user/logout")
    Call<ApiResponse<Object>> logout();
}